#include <stdio.h>
#include <string.h>
// memcpy 只要处理不重叠的内存拷贝就可以了。当内存发生局部重叠的时候,memcpy不保证拷贝的结果的正确。
// memmove 处理重叠内存的拷贝

// 需要区分从前往后 dest < src
// 还是从后往前拷贝

void *my_memmove(void *dest,const void *src,int num){
    assert(dest && src);
    if(dest < src){ //从前往后拷贝
        while(num--){
            *((char *)dest ++) = *((char *)src ++);
        }
    } else{ // 从前往后拷贝
        while (num--)
        {
            *((char *)dest + num) = *((char *)src + num);
        }
    }
    return dest;
}
int main()
{
    int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    my_memmove(arr1 + 2, arr1, 5 * sizeof(int));
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr1[i]);
    }
    printf("\n");

    int arr2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    my_memmove(arr2, arr2 + 2, 5 * sizeof(int));
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr2[i]);
    }
    printf("\n");

    int arr3[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    // 需求：把1 2 3 4 5 放到 3 4 5 6 7的位置，变成 1 2 1 2 3 4 5 8 9 10
    memmove(arr3 + 2, arr3, 5 * sizeof(int)); // 重点：最后这个数是字节数，一个数字占4个字节
    // 这样copy有问题，使用memmove处理内存重叠的问题
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr3[i]);
    }

    return 0; // 返回 0
}
